//package com.bestcem.xm.common.core.oss.service.impl;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.URLUtil;
//import com.aliyun.oss.internal.OSSConstants;
//import com.bestcem.xm.common.core.oss.dao.OssRecordDao;
//import com.bestcem.xm.common.core.oss.entity.OssRecordEntity;
//import com.bestcem.xm.common.core.oss.enums.OssPathEnum;
//import com.bestcem.xm.common.core.oss.service.OssService;
//import com.bestcem.xm.common.core.uitls.CommonUtil;
//import io.minio.*;
//import io.minio.http.Method;
//import io.minio.messages.DeleteError;
//import io.minio.messages.DeleteObject;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.math.NumberUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//import java.io.BufferedInputStream;
//import java.io.ByteArrayInputStream;
//import java.io.File;
//import java.io.InputStream;
//import java.net.URL;
//import java.net.URLEncoder;
//import java.nio.file.Files;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//import static org.apache.commons.lang3.math.NumberUtils.LONG_ZERO;
//
///**
// * MinIO对象存储
// *
// * @author zh.zhang
// * @version v1.0
// * @date 2021-09-16
// */
//@Service
//@Slf4j
//@ConditionalOnProperty(prefix = "OSS", name = "ossType", havingValue = "minio")
//public class MinioServiceImpl implements OssService {
//
//    public static final String OSS_TYPE = "minio";
//
//    @Value("${OSS.minio.endpoint:aa}")
//    private String endpoint;
//
//    @Value("${OSS.minio.accessKey:aa}")
//    private String accessKey;
//
//    @Value("${OSS.minio.secretKey:aa}")
//    private String secretKey;
//
//    @Value("${OSS.minio.bucketName:aa}")
//    private String bucketName;
//
//    private MinioClient minioClient;
//
//    @Value("${OSS.minio.file-prefix:test/}")
//    private String prefix;
//
//    @Value("${OSS.minio.cdn:test}")
//    private String cdn;
//
//    @Value("${OSS.minio.enableExpire:false}")
//    private Boolean enableExpire;
//
//    @Resource
//    private OssRecordDao ossRecordDao;
//
//    /**
//     * 初始化minioClient，请求oss前调用
//     */
//    @PostConstruct
//    public void initClient() {
//        minioClient = MinioClient.builder()
//                .endpoint(this.endpoint)
//                .credentials(this.accessKey, this.secretKey)
//                .build();
//    }
//
//    /**
//     * 上传需要长时间存储文件
//     *
//     * @param file         上传文件对象
//     * @param fileName     文件名，例：aaa.txt
//     * @param modulePath   目录模块名前缀，使用不同目录区分不同模块文件，例：member/ds/
//     *                     长期存储文件目录
//     *                     {@link OssPathEnum#AWARD}
//     *                     {@link OssPathEnum#MEMBER}
//     *                     {@link OssPathEnum#TXTANLS}
//     *                     {@link OssPathEnum#OM}
//     * @param expireSecond 文件可用超时时间,单位为秒。如果要永久存储，可以传0或-1
//     * @param localDir     文件在本地的绝对路径，方便后续查找
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return 访问文件的url
//     * modulePath参数请使用下面四种枚举
//     * @see OssPathEnum -AWARD
//     * @see OssPathEnum -MEMBER
//     * @see OssPathEnum -TXTANLS
//     * @see OssPathEnum -SAAS
//     */
//    @Override
//    public String uploadSimpleFile(File file, String fileName, OssPathEnum modulePath, long expireSecond, String localDir, String remark) {
//        String path = modulePath.getPath();
//        String url = "";
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//
//        try {
//            // 上传文件
//            url = uploadFile(file, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}", fileName, path, key, e);
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            ossRecordDao.insertSimple(key, fileName, url, uuid, modulePath, expireTime, localDir, remark, OSS_TYPE);
//        }
//
//        return url;
//    }
//
//    /**
//     * 上传需要长时间存储文件
//     *
//     * @param file         上传文件对象
//     * @param fileName     文件名，例：aaa.txt
//     * @param path         目录模块名前缀，使用不同目录区分不同模块文件，例：member/ds/
//     *                     长期存储文件目录
//     * @param expireSecond 文件可用超时时间,单位为秒。如果要永久存储，可以传0或-1
//     * @param localDir     文件在本地的绝对路径，方便后续查找
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return 访问文件的url
//     * modulePath参数请使用下面四种枚举
//     * @see OssPathEnum -AWARD
//     * @see OssPathEnum -MEMBER
//     * @see OssPathEnum -TXTANLS
//     * @see OssPathEnum -SAAS
//     */
//    @Override
//    public String uploadSimpleFile2(File file, String fileName, String path, long expireSecond, String localDir, String remark, OssPathEnum modulePath) {
//        String url = "";
//        String key = this.prefix + path + fileName;
//
//        try {
//            // 上传文件
//            url = uploadFile(file, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}", fileName, path, key, e);
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            ossRecordDao.insertSimple2(key, fileName, url, fileName, path, expireTime, localDir, remark, OSS_TYPE, modulePath);
//        }
//
//        return url;
//    }
//
//    /**
//     * 上传需要长时间存储文件
//     *
//     * @param file         上传文件对象
//     * @param fileName     文件名，例：aaa.txt
//     * @param modulePath   目录模块名前缀，使用不同目录区分不同模块文件，例：member/ds/
//     *                     长期存储文件目录
//     *                     {@link OssPathEnum#AWARD}
//     *                     {@link OssPathEnum#MEMBER}
//     *                     {@link OssPathEnum#TXTANLS}
//     *                     {@link OssPathEnum#OM}
//     * @param expireSecond 文件可用超时时间,单位为秒。如果要永久存储，可以传0或-1
//     * @param localDir     文件在本地的绝对路径，方便后续查找
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return OssRecordEntity 保存记录
//     * modulePath参数请使用下面四种枚举
//     * @see OssPathEnum -AWARD
//     * @see OssPathEnum -MEMBER
//     * @see OssPathEnum -TXTANLS
//     * @see OssPathEnum -SAAS
//     */
//    @Override
//    public OssRecordEntity uploadSimpleFileReturnEntity(File file, String fileName, OssPathEnum modulePath, long expireSecond, String localDir, String remark) {
//        OssRecordEntity entity = new OssRecordEntity();
//
//        String path = modulePath.getPath();
//        String url = "";
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//
//        try {
//            // 上传文件
//            url = uploadFile(file, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}, e:{}", fileName, path, key, e.toString());
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            entity = ossRecordDao.insertSimple(key, fileName, url, uuid, modulePath, expireTime, localDir, remark, OSS_TYPE);
//        }
//
//        return entity;
//    }
//
//    /**
//     * 上传临时存储文件,导出使用
//     *
//     * @param file         上传文件对象
//     * @param fileName     文件名，例：aaa.txt
//     * @param modulePath   目录模块名前缀，使用不同目录区分不同模块文件
//     *                     临时文件目录
//     *                     {@link OssPathEnum#TEMP_AWARD}
//     *                     {@link OssPathEnum#TEMP_MEMBER}
//     *                     {@link OssPathEnum#TEMP_TXTANLS}
//     *                     {@link OssPathEnum#TEMP_OM}
//     * @param expireSecond 文件可用超时时间，单位为秒
//     * @param localDir     文件在本地的绝对路径，方便后续查找
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return 过期原因：modulePrefix使用枚举来定义
//     */
//    @Override
//    public String uploadTempFile(File file, String fileName, OssPathEnum modulePath, long expireSecond, String localDir, String remark) {
//        String path = modulePath.getPath();
//        String url = "";
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//
//        try {
//            // 上传文件
//            url = uploadFile(file, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}, e:{}", fileName, path, key, e.toString());
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            ossRecordDao.insertTemp(key, fileName, url, uuid, modulePath, expireTime, localDir, remark, OSS_TYPE);
//        }
//
//        return url;
//    }
//
//    /**
//     * 上传临时存储文件,导出使用
//     *
//     * @param file         上传文件对象
//     * @param fileName     文件名，例：aaa.txt
//     * @param modulePath   目录模块名前缀，使用不同目录区分不同模块文件
//     *                     临时文件目录
//     *                     {@link OssPathEnum#TEMP_AWARD}
//     *                     {@link OssPathEnum#TEMP_MEMBER}
//     *                     {@link OssPathEnum#TEMP_TXTANLS}
//     *                     {@link OssPathEnum#TEMP_OM}
//     * @param expireSecond 文件可用超时时间，单位为秒
//     * @param localDir     文件在本地的绝对路径，方便后续查找
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return 过期原因：modulePrefix使用枚举来定义 返回数据库保存实体
//     */
//    @Override
//    public OssRecordEntity uploadTempFileReturnEntity(File file, String fileName, OssPathEnum modulePath, long expireSecond, String localDir, String remark) {
//        OssRecordEntity entity = new OssRecordEntity();
//
//        String path = modulePath.getPath();
//        String url = "";
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//
//        try {
//            // 上传文件
//            url = uploadFile(file, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}, e:{}", fileName, path, key, e.toString());
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            entity = ossRecordDao.insertTemp(key, fileName, url, uuid, modulePath, expireTime, localDir, remark, OSS_TYPE);
//        }
//
//        return entity;
//    }
//
//    /**
//     * 上传临时存储文件对应的字节流数组,导出使用
//     *
//     * @param data         上传文件对象对应的字节流数组
//     * @param fileName     文件名，例：aaa.txt
//     * @param modulePath   目录模块名前缀，使用不同目录区分不同模块文件
//     * @param expireSecond 文件可用超时时间，单位为秒
//     * @param remark       上传文件用途，例如：文本分析-原话导出
//     * @return java.lang.String
//     */
//    @Override
//    public String uploadTempFile(byte[] data, String fileName, OssPathEnum modulePath, long expireSecond, String remark) {
//        String url = "";
//        if (Objects.isNull(data) || Objects.isNull(modulePath)) {
//            log.error("OSS uploadFile error, data is empty");
//            return url;
//        }
//
//        String path = modulePath.getPath();
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//
//        try {
//            // 上传文件
//            url = uploadFile(data, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}, e:{}", fileName, path, key, e.toString());
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            ossRecordDao.insertTemp(key, fileName, url, uuid, modulePath, expireTime, "", remark, OSS_TYPE);
//        }
//
//        return url;
//    }
//
//    @Override
//    public String uploadFile(byte[] data, String fileName, OssPathEnum modulePath, String remark) {
//        String url = "";
//        if (Objects.isNull(data) || Objects.isNull(modulePath)) {
//            log.error("OSS uploadFile error, data is empty, fileName:{}, modulePath:{}", fileName, modulePath);
//            return url;
//        }
//
//        String path = modulePath.getPath();
//        String uuid = CommonUtil.getUUID();
//        String key = this.prefix + path + uuid;
//        // minio必须设置链接过期时间
//        long expireSecond = TimeUnit.DAYS.toSeconds(7);
//        try {
//            // 上传文件
//            url = uploadFile(data, key, expireSecond, fileName);
//        } catch (Exception e) {
//            log.error("OSS upload error, fileName:{}, modulePrefix:{}, key:{}, e:{}", fileName, path, key, e.toString());
//        }
//
//        if (StringUtils.isNotBlank(url)) {
//            Date expireTime = null;
//            if (expireSecond > NumberUtils.LONG_ZERO) {
//                LocalDateTime now = LocalDateTime.now();
//                expireTime = Date.from(now.plusSeconds(expireSecond).atZone(ZoneId.systemDefault()).toInstant());
//            }
//
//            // 保存上传记录
//            ossRecordDao.insertSimple(key, fileName, url, uuid, modulePath, expireTime, "", remark, OSS_TYPE);
//        }
//        return url;
//    }
//
//    /**
//     * 根据key删除OSS文件
//     * 注意：只可以删除OSS_Record表中有记录的key，否则会返回删除失败，也就是0L
//     *
//     * @param key OSS中的key
//     * @return 删除条数, 删除成功为1，失败为0
//     */
//    @Override
//    public long deleteByKey(String key) {
//        OssRecordEntity entity = ossRecordDao.findByKey(key);
//        if (Objects.isNull(entity)) {
//            log.error("OSS key未查询到上传记录,OSS key:{}", key);
//            return LONG_ZERO;
//        }
//
//        long deleteCount = 0L;
//        try {
//            deleteCount++;
//            minioClient.removeObject(
//                    RemoveObjectArgs.builder()
//                            .bucket(this.bucketName)
//                            .object(key)
//                            .build()
//            );
//        } catch (Exception e) {
//            deleteCount--;
//            log.error("删除OSS文件出现异常，OSS_key:{}", key, e);
//        }
//        if (deleteCount > 0) {
//            return ossRecordDao.updateIsDeleted(entity.getId());
//        }
//        return deleteCount;
//    }
//
//    /**
//     * 删除模块内OSS中未删除并且已过期的文件
//     *
//     * @param modulePath 模块目录
//     *                   {@link OssPathEnum#AWARD}
//     *                   {@link OssPathEnum#MEMBER}
//     *                   {@link OssPathEnum#TXTANLS}
//     *                   {@link OssPathEnum#OM}
//     *                   {@link OssPathEnum#TEMP_AWARD}
//     *                   {@link OssPathEnum#TEMP_MEMBER}
//     *                   {@link OssPathEnum#TEMP_TXTANLS}
//     *                   {@link OssPathEnum#TEMP_OM}
//     * @return 删除文件数量
//     * @see OssPathEnum
//     */
//    @Override
//    public long deleteTempByModule(OssPathEnum modulePath) {
//        int pageSize = 200;
//        long deleteCount = 0L;
//        List<OssRecordEntity> ossRecordEntities;
//
//        do {
//            ossRecordEntities = ossRecordDao.findTempByModule(modulePath, pageSize);
//            if (CollUtil.isEmpty(ossRecordEntities)) {
//                log.error("模块中可删除文件数为空,modulePath:{}", modulePath);
//                return deleteCount;
//            }
//
//            List<DeleteObject> objects = new ArrayList<>(ossRecordEntities.size());
//            List<String> ids = new ArrayList<>(ossRecordEntities.size());
//            for (OssRecordEntity ossRecordEntity : ossRecordEntities) {
//                objects.add(new DeleteObject(ossRecordEntity.getOssKey()));
//                ids.add(ossRecordEntity.getId());
//            }
//
//            // MinIO中删除
//            Iterable<Result<DeleteError>> results = minioClient.removeObjects(
//                    RemoveObjectsArgs.builder()
//                            .bucket(this.bucketName)
//                            .objects(objects)
//                            .build()
//            );
//
//            List<String> deletedKeys = new ArrayList<>();
//            for (Result<DeleteError> result : results) {
//                DeleteError error;
//                try {
//                    error = result.get();
//                    deletedKeys.add(error.objectName());
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//
//            // oss记录表中更新
//            if (deletedKeys.size() == ossRecordEntities.size()) {
//                deleteCount += ossRecordDao.deleteRecord(ids);
//            } else {
//                List<String> deletedIds = ossRecordEntities.stream()
//                        .filter(o -> deletedKeys.contains(o.getOssKey()))
//                        .map(OssRecordEntity::getId)
//                        .collect(Collectors.toList());
//                log.error("删除OSS临时文件未删除完全，需要删除的文件记录id:{},完成删除的文件记录id:{}", ids, deletedIds);
//                deleteCount += ossRecordDao.deleteRecord(deletedIds);
//            }
//
//        } while (CollUtil.isNotEmpty(ossRecordEntities) && ossRecordEntities.size() == pageSize);
//
//        return deleteCount;
//    }
//
//    /**
//     * 下载文件流
//     *
//     * @param ossKey OSS中存储的
//     * @return InputStream
//     */
//    @Override
//    public InputStream downloadFile(String ossKey) {
//        InputStream stream = null;
//        try {
//            stream = minioClient.getObject(
//                    GetObjectArgs.builder()
//                            .bucket(this.bucketName)
//                            .object(ossKey)
//                            .build()
//            );
//        } catch (Exception e) {
//            log.error("下载OSS文件报错，ossKey:{}", ossKey, e);
//        }
//
//        return Objects.isNull(stream) ? null : stream;
//    }
//
//    /**
//     * 下载文件
//     *
//     * @param ossKey OSS中存储的
//     * @param file   指定的下载到文件对象
//     */
//    @Override
//    public void downloadFile(String ossKey, File file) {
//        if (Objects.isNull(file)) {
//            log.error("下载文件File对象不能为空");
//            return;
//        }
//
//        try {
//            minioClient.downloadObject(
//                    DownloadObjectArgs.builder()
//                            .bucket(this.bucketName)
//                            .object(ossKey)
//                            .filename(file.getAbsolutePath())
//                            .build()
//            );
//        } catch (Exception e) {
//            log.error("下载OSS文件报错，ossKey:{}", ossKey, e);
//        }
//    }
//
//    /**
//     * 下载文件
//     *
//     * @param url oss文件的url
//     * @return 返回流，使用流请记得关闭！！
//     */
//    @Override
//    public InputStream downloadByUrl(String url) {
//        InputStream stream = null;
//
//        try {
//            stream = URLUtil.getStream(new URL(url));
//        } catch (Exception e) {
//            log.error("下载OSS文件报错，url:{}", url);
//            log.error("下载文件报错，异常信息.", e);
//        }
//
//        return Objects.isNull(stream) ? null : stream;
//    }
//
//    /**
//     * 使用OSSKey直接删除OSS中的文件，不修改记录表
//     * 用来删除未存记录表的文件
//     *
//     * @param ossKey ossKey
//     */
//    @Override
//    public void trueDelete(String ossKey) {
//        try {
//            minioClient.removeObject(
//                    RemoveObjectArgs.builder()
//                            .bucket(this.bucketName)
//                            .object(ossKey)
//                            .build()
//            );
//        } catch (Exception e) {
//            log.error("删除OSS文件出现异常，OSS_key:{}", ossKey, e);
//        }
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param file       文件对象
//     * @param key        ossKey
//     * @param expireTime 过期日期
//     * @param fileName   需要返回前端的文件
//     * @return 生成的访问的连接
//     */
//    private String uploadFile(File file, String key, long expireTime, String fileName) {
//        try {
//            minioClient.bucketExists(BucketExistsArgs.builder().bucket(this.bucketName).build());
//        } catch (Exception e) {
//            log.error("bucket not found,bucket name is {} ", this.bucketName);
//            return "";
//        }
//
//        ObjectWriteResponse response = null;
//        try (BufferedInputStream bis = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
//            // Object Metadata
//            HashMap<String, String> headerMap = new HashMap<>();
//            headerMap.put("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
//
//            String contentType = "application/octet-stream";
//            if (fileName.endsWith(".zip")) {
//                contentType = "application/zip";
//            }
//            response = minioClient.putObject(PutObjectArgs.builder()
//                    .bucket(this.bucketName)
//                    .object(key)
//                    .stream(bis, -1, 10485760)
//                    .extraHeaders(headerMap)
//                    .contentType(contentType)
//                    .build()
//            );
//
//        } catch (Exception e) {
//            log.error("response: {}", response, e);
//            return "";
//        }
//        log.info("response:{}", response);
//
//        return getUrl(key, expireTime, fileName);
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param data       上传文件对象对应的字节流数组
//     * @param key        ossKey
//     * @param expireTime 过期日期
//     * @param fileName   需要返回前端的文件
//     * @return 生成的访问的连接
//     */
//    private String uploadFile(byte[] data, String key, long expireTime, String fileName) {
//        try {
//            minioClient.bucketExists(BucketExistsArgs.builder().bucket(this.bucketName).build());
//        } catch (Exception e) {
//            log.error("bucket not found,bucket name is {} ", this.bucketName);
//            return "";
//        }
//
//        ObjectWriteResponse response = null;
//        try (ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
//            // Object Metadata
//            HashMap<String, String> headerMap = new HashMap<>();
//            headerMap.put("Content-Disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
//
//            response = minioClient.putObject(PutObjectArgs.builder()
//                    .bucket(this.bucketName)
//                    .object(key)
//                    .stream(bis, -1, 10485760)
//                    .extraHeaders(headerMap)
//                    .build()
//            );
//
//        } catch (Exception e) {
//            log.error("response: {}", response, e);
//            return "";
//        }
//        log.info("response:{}", response);
//
//        return getUrl(key, expireTime, fileName);
//    }
//
//    /**
//     * 默认超时时间 5分钟
//     */
//    private static final long DEFAULT_EXPIRE = 5 * 60;
//
//    /**
//     * 获取访问文件的url
//     *
//     * @param fileKey    文件key
//     * @param expireTime 过期时间,单位秒
//     * @return url
//     */
//    private String getUrl(String fileKey, long expireTime, String fileName) {
//        String url = null;
//
//        // 分享链接的时效必须在: 1秒 ~ 7天之间，否则返回永久链接
//        if (expireTime < 1) {
//            expireTime = DEFAULT_EXPIRE;
//        } else if (expireTime > TimeUnit.DAYS.toSeconds(7)) {
//            expireTime = TimeUnit.DAYS.toSeconds(7);
//        }
//        try {
//            url = minioClient.getPresignedObjectUrl(
//                    GetPresignedObjectUrlArgs.builder()
//                            .method(Method.GET)
//                            .bucket(this.bucketName)
//                            .object(fileKey)
//                            .expiry((int) expireTime)
//                            .build());
//
//            // 将返回得内网域名改为外网域名
//            url = cdn + url.substring(url.indexOf(prefix));
//        } catch (Exception e) {
//            log.error("minio geturl error", e);
//        }
//
//        if (!enableExpire) {
//            url = Objects.requireNonNull(url).substring(0, url.indexOf("?"));
//        }
//
//        return url;
//    }
//
//    @Override
//    public String getFilePrefix() {
//        return prefix;
//    }
//
//    @Override
//    public String getCdn() {
//        return cdn;
//    }
//
//    @Override
//    public String getUrlPrefix() {
//        return OSSConstants.PROTOCOL_HTTPS + this.cdn + "/" + this.prefix;
//    }
//}
